package com.logistics.service;

import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色层级服务
 * 用于判断角色之间的层级关系和权限
 */
@Service
public class RoleHierarchyService {
    
    // 角色层级定义（数字越大，权限越高）
    private static final Map<String, Integer> ROLE_HIERARCHY = new HashMap<>();
    
    static {
        ROLE_HIERARCHY.put("PLATFORM_ADMIN", 100);  // 平台超级管理员（最高权限）
        ROLE_HIERARCHY.put("SUPER_ADMIN", 90);      // 租户超级管理员
        ROLE_HIERARCHY.put("SITE_ADMIN", 80);       // 站点管理员
    }
    
    /**
     * 获取角色的层级值
     */
    public int getRoleLevel(String role) {
        return ROLE_HIERARCHY.getOrDefault(role, 0);
    }
    
    /**
     * 判断角色A是否高于角色B
     */
    public boolean isHigherThan(String roleA, String roleB) {
        return getRoleLevel(roleA) > getRoleLevel(roleB);
    }
    
    /**
     * 判断角色A是否高于或等于角色B
     */
    public boolean isHigherOrEqual(String roleA, String roleB) {
        return getRoleLevel(roleA) >= getRoleLevel(roleB);
    }
    
    /**
     * 判断当前角色是否可以管理目标角色
     * 规则：只能管理比自己层级低的角色
     */
    public boolean canManage(String currentRole, String targetRole) {
        return isHigherThan(currentRole, targetRole);
    }
    
    /**
     * 判断当前角色是否可以创建目标角色的用户
     * 规则：
     * - 超级管理员可以创建所有角色（除了平台管理员）
     * - 站点管理员可以创建：租户管理员、操作员、普通用户
     * - 租户管理员可以创建：操作员、普通用户
     */
    public boolean canCreateRole(String currentRole, String targetRole) {
        // 任何人都不能创建平台管理员
        if ("PLATFORM_ADMIN".equals(targetRole)) {
            return false;
        }
        // 平台管理员：可以创建 SUPER_ADMIN、SITE_ADMIN，以及任意自定义角色
        if ("PLATFORM_ADMIN".equals(currentRole)) {
            return true;
        }
        // 超级管理员：可以创建 SITE_ADMIN 以及任意自定义角色；不可创建 SUPER_ADMIN/PLATFORM_ADMIN
        if ("SUPER_ADMIN".equals(currentRole)) {
            return !"SUPER_ADMIN".equals(targetRole);
        }
        // 站点管理员：只能创建自定义角色，不能创建内置角色
        if ("SITE_ADMIN".equals(currentRole)) {
            return !"PLATFORM_ADMIN".equals(targetRole)
                    && !"SUPER_ADMIN".equals(targetRole)
                    && !"SITE_ADMIN".equals(targetRole);
        }
        // 其他（自定义角色）：无权创建
        return false;
    }
    
    /**
     * 获取当前角色可以创建的角色列表
     */
    public List<String> getCreatableRoles(String currentRole) {
        // 仅返回内置角色中可创建的部分；自定义角色不在此列表，由角色管理模块创建
        if ("PLATFORM_ADMIN".equals(currentRole)) {
            return java.util.Arrays.asList("SUPER_ADMIN", "SITE_ADMIN");
        }
        if ("SUPER_ADMIN".equals(currentRole)) {
            return java.util.Arrays.asList("SITE_ADMIN");
        }
        return java.util.Collections.emptyList();
    }
    
    /**
     * 获取角色的显示名称
     */
    public String getRoleDisplayName(String role) {
        return switch (role) {
            case "PLATFORM_ADMIN" -> "平台超级管理员";
            case "SUPER_ADMIN" -> "超级管理员";
            case "SITE_ADMIN" -> "站点管理员";
            default -> role;
        };
    }
    
    /**
     * 判断角色是否是管理员级别（可以管理其他用户）
     */
    public boolean isAdminRole(String role) {
        return "PLATFORM_ADMIN".equals(role) || "SUPER_ADMIN".equals(role) || "SITE_ADMIN".equals(role);
    }
    
    /**
     * 判断角色是否可以访问某个功能
     * @param role 用户角色
     * @param requiredRoles 需要的角色列表（满足其一即可）
     */
    public boolean hasAnyRole(String role, String... requiredRoles) {
        if (requiredRoles == null || requiredRoles.length == 0) {
            return true;
        }
        return Arrays.asList(requiredRoles).contains(role);
    }
}

